﻿/* 
 * Copyright (c) 2011-12 Andrey Bulygin
 * 
 * This file is part of Interceptor.
 * Interceptor is free software: you can redistribute it and/or modify it under the terms of the GNU 
 * Library General Public License as published by the Free Software Foundation, either version 3 of the 
 * License, or (at your option) any later version.
 * 
 * Interceptor is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 
 * the GNU Library General Public License for more details. You should have received a copy of the GNU 
 * Library General Public License along with Interceptor. If not, write to the Free Software Foundation, Inc., 59 
 * Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Interceptor.Core
{
	internal static class KeyValueCache<TKey, TValue>
	{
		private static System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> _cache = new System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue>();

		public static TValue TryToGet(TKey key, Func<TKey, TValue> addValueFactory)
		{
			if (!_cache.ContainsKey(key))
			{
				lock (_cache)
				{
					if (!_cache.ContainsKey(key))
					{
						_cache.AddOrUpdate(key, addValueFactory(key), (k, v) => v);
					}
				}
			}
			return _cache[key];
		}
	}
}
